package 程序员面试金典;

/**
 * 面试题 08.05. 递归乘法
 * 递归乘法。 写一个递归函数，不使用 * 运算符， 实现两个正整数的相乘。可以使用加号、减号、位移，但要吝啬一些。
 *
 * 示例1:
 *
 *  输入：A = 1, B = 10
 *  输出：10
 * 示例2:
 *
 *  输入：A = 3, B = 4
 *  输出：12
 * 提示:
 *
 * 保证乘法范围不会溢出
 */
public class T08_05 {
    //快速幂
    public int multiply(int A, int B) {

        int ans = 0;

        while (B > 0) {
            if ((B & 1) == 1) {
                ans += A;
            }
            B = B >> 1; //向左位移一位 依然大于0  说明B变成了 原来的1/2  此时A变成原来的两倍 保持乘积不变
            if (B > 0) {
                A = A + A;
            }
        }

        return ans;

    }

}
